package com.tmx.mvcframework.servlet;

import com.tmx.mvcframework.Controller.HelloController;
import com.tmx.mvcframework.annotation.MXRequestMapping;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;

/**
 * 目标：实现路径请求的拦截以及返回处理的结果
 */
public class MXDispatchServletV1 extends HttpServlet {
   //IOC容器
    private Map<String,Object> springContext;

    @Override
    public void init() throws ServletException {
        //1，读取配置文件

    }

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        springContext = new HashMap<>();
        //将有注解的类放入IOC容器中，怎么做？
        //建立一个map用来存放，但是这个map里面该怎么存储这个值呢？ 键  值，那个做键，那个做值呢？



        //IOC实现,既然我的ioc和di这么强，那么我可不可在这个基础上面实现一个mvc控制器呢？
        // 那当然是没问题了 我只需要通过从ioc中拿到对象然后调用其方法就能实现了。

        springContext.put("id",new HelloController());


        //怎么将标有@auto注解的属性注值呢？根据什么类型来进行匹配呢？ 是根据父类还是什么？
        // 利用反射技术拿到类的全路径创建对象吗？还是从ioc容器中直接获得对象？或者说是两者共存呢？

        //DI实现
        try {
            HelloController o = (HelloController) springContext.get("id");
            Class<? extends HelloController> aClass = o.getClass();
//            Method getHello = aClass.getMethod("getHello", new Class[]{null});
            HelloController helloController = aClass.newInstance();
//            if (getHello.isAnnotationPresent(MXRequestMapping.class)){
//
//
//            }
            //aop实现
            //mvc实现
            String hello = helloController.getHello();
            resp.setCharacterEncoding("UTF-8");
            resp.setHeader("content-type","text/html;charset=UTF-8");
            resp.getWriter().write(hello);
        } catch (Exception e) {
            e.printStackTrace();
        }
//
//
//
//
//        //将表示url的注解的值读取出来，怎么做？
//        //将请求的url获取，进行匹配，转交对象进行处理后结果怎么插入resp对象中去呢？ 如果对象使用了responsebody注解怎么转化为json对象呢？
//        String requestURI = req.getRequestURI();
//        System.out.println(requestURI);
//        resp.getWriter().write("hello MXSpringMVC!");
    }
}
